// import fetch from 'dva/fetch';
// import { notification } from 'antd';
// import { routerRedux } from 'dva/router';
// import store from '../index';
//
// const codeMessage = {
//   200: '服务器成功返回请求的数据。',
//   201: '新建或修改数据成功。',
//   202: '一个请求已经进入后台排队（异步任务）。',
//   204: '删除数据成功。',
//   400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
//   401: '用户没有权限（令牌、用户名、密码错误）。',
//   403: '用户得到授权，但是访问是被禁止的。',
//   404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
//   406: '请求的格式不可得。',
//   410: '请求的资源被永久删除，且不会再得到的。',
//   422: '当创建一个对象时，发生一个验证错误。',
//   500: '服务器发生错误，请检查服务器。',
//   502: '网关错误。',
//   503: '服务不可用，服务器暂时过载或维护。',
//   504: '网关超时。',
// };
// function checkStatus(response) {
//   if (response.status >= 200 && response.status < 300) {
//     return response;
//   }
//   const errortext = codeMessage[response.status] || response.statusText;
//   notification.error({
//     message: `请求错误 ${response.status}: ${response.url}`,
//     description: errortext,
//   });
//   const error = new Error(errortext);
//   error.name = response.status;
//   error.response = response;
//   throw error;
// }
//
// /**
//  * Requests a URL, returning a promise.
//  *
//  * @param  {string} url       The URL we want to request
//  * @param  {object} [options] The options we want to pass to "fetch"
//  * @return {object}           An object containing either "data" or "err"
//  */
// export default function request(url, options) {
//   const defaultOptions = {
//     credentials: 'include',
//   };
//   const newOptions = { ...defaultOptions, ...options };
//   if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
//     if (!(newOptions.body instanceof FormData)) {
//       newOptions.headers = {
//         Accept: 'application/json',
//         'Content-Type': 'application/json; charset=utf-8',
//         ...newOptions.headers,
//       };
//       newOptions.body = JSON.stringify(newOptions.body);
//     } else {
//       // newOptions.body is FormData
//       newOptions.headers = {
//         Accept: 'application/json',
//         'Content-Type': 'multipart/form-data',
//         ...newOptions.headers,
//       };
//     }
//   }
//
//   return fetch(url, newOptions)
//     .then(checkStatus)
//     .then(response => {
//       if (newOptions.method === 'DELETE' || response.status === 204) {
//         return response.text();
//       }
//       return response.json();
//     })
//     .catch(e => {
//       const { dispatch } = store;
//       const status = e.status;
//       if (status === 2005) {
//         dispatch({
//           type: 'login/logout',
//         });
//         return;
//       }
//       if (status === 403) {
//         dispatch(routerRedux.push('/exception/403'));
//         return;
//       }
//       if (status <= 504 && status >= 500) {
//         dispatch(routerRedux.push('/exception/500'));
//         return;
//       }
//       if (status >= 404 && status < 422) {
//         dispatch(routerRedux.push('/exception/404'));
//       }
//     });
// }

import fetch from 'dva/fetch';
import { notification } from 'antd';
import { routerRedux } from 'dva/router';
import store from '../index';
import G from './g';

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }
  notification.error({
    message: `请求错误 ${response.status}: ${response.url}`,
    description: response.statusText,
  });
  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options) {
  const token= window.localStorage.token;
  const clientId = window.localStorage.clientId;
  const defaultOptions = {
    credentials: 'include',
    headers: {
      'accessToken': token,
      'X-APIHitgou-AccessToken': token, // APP端 /api的接口 请求需要带上clientId与token
      'X-APIHitgou-ClientId': clientId,
    }
  };
  const newOptions = { ...defaultOptions, ...options };
  //console.log('newOptions',newOptions);
  if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
    newOptions.headers = {
      Accept: 'application/json',
      'Content-Type': 'application/json; charset=utf-8',
      'accessToken': token,
      ...options.headers,
    };

    //当是表单文件类型上传时，不需要设置content-type
    if(newOptions.headers['Content-Type'] == 'multipart/form-data'){
        delete newOptions.headers['Content-Type'];
    }
    if(newOptions.headers['Content-Type'] == 'application/json; charset=utf-8'){
      newOptions.body = JSON.stringify(newOptions.body);
    }
  }

  return fetch( url, newOptions)
    .then(checkStatus)
    .then(response => {
      return response.json();
    }).then(response=>{  //li add 对返回数据进一步处理，去掉数据结构code与data层，直接返回真实数据eg:{code:0,data:data}=>return data;
      var responseData = null;
      if(typeof response.status != 'undefined'){  //确保按照后台正确响应格式返回数据
        if(response.status === 2000){
          if(response.data && response.data.list instanceof Array){  //分页数据处理下分页的参数
            let {list, startIndex, count, pageSize} = response.data;
            //currPage = currPage + 1;    //列表返回数据是从0开始，这里需要从1开始  ******反复和云飞确认列表返回currPage是从1开始，所以不用自+1；
            response.data = {
              list,
              pagination : {
                current: startIndex/pageSize + 1, //列表返回数据是从0开始的序号，0，10，20等
                pageSize,
                total: count,
              }
            }
          }
          responseData =  response.data;
        }else if(response.status == 2007){
          console.log('响应2007,未登录,', response.message);
          const { dispatch } = store;
          //未登录
          notification.error({
            message: '请求错误',
            description: response.message,
          });
          responseData = response;
          dispatch({
            type: 'login/logout',
          });
          return;
        }
        else{
          notification.error({
            message: '请求错误',
            description: response.message,
          });
        }
      }else{
        responseData =  response;
      }
      //console.log(responseData);
      return new Promise((resolve)=>{resolve(responseData)});
    })
    .catch((error) => {
      if (error.status) {
        notification.error({
          message: error.name,
          description: error.message,
        });
      }
      if ('stack' in error && 'message' in error) {
        notification.error({
          message: `请求错误: ${url}`,
          description: error.message,
        });
      }
      return false;
      //return error;
    });
}

